// C++条款17：以独立语句将newed对象置入智能指针
// 核心原则
// 将资源（通过new创建的对象）放入智能指针时，应该使用独立的语句完成这一操作。
// 简单来说，就是将这两个操作分开：

// 创建对象（使用new）
// 将对象置入智能指针

// 问题场景
// 让我们看一个看似无害但实际上可能导致资源泄漏的例子：
// 危险的代码
processWidget(std::shared_ptr<Widget>(new Widget), priority());
// 这行代码做了三件事：
// 1.执行new Widget创建Widget对象
// 2.构造std::shared_ptr<Widget>来管理这个对象
// 3.调用priority()函数获取优先级
// 问题在于：C++编译器不保证这三个操作的执行顺序。虽然第1步必须在第2步之前执行（因为需要将指针传给shared_ptr构造函数），但第3步priority()可能在任何时候执行，包括：
// 在new Widget之后，但在构造shared_ptr之前
// 在new Widget之前
// 在构造shared_ptr之后

// 潜在的资源泄漏
// 假设执行顺序如下：
// 执行new Widget创建对象
// 调用priority()函数
// 构造std::shared_ptr
// 如果priority()函数抛出异常，那么第3步将不会执行，而第1步创建的Widget对象没有被智能指针管理，就会导致内存泄漏。
int priority()
{
    // 假设这里抛出异常
    throw std::runtime_error("Priority calculation failed");
    return 100;
}

// 危险的代码
processWidget(std::shared_ptr<Widget>(new Widget), priority());
// 如果priority()抛出异常，new Widget创建的对象将泄漏

// 正确的做法
// 使用独立语句创建智能指针：
// 安全的代码
std::shared_ptr<Widget> widgetPtr(new Widget); // 独立语句
processWidget(widgetPtr, priority());          // 即使priority()抛出异常，Widget也不会泄漏

// 更现代的做法
// 使用std::make_shared或std::make_unique（C++ 14及以后）：
// 最佳实践
auto widgetPtr = std::make_shared<Widget>(); // 更高效，更安全
processWidget(widgetPtr, priority());
// 使用make_shared不仅避免了资源泄漏问题，还提高了效率（只需一次内存分配，而不是两次）。